#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
文件操作模块使用示例

该脚本展示了如何使用文件操作模块的各种功能。

创建时间: 2023-07-12
作者: Python Tools Team
"""

import os
import tempfile
from pathlib import Path

# 导入文件操作模块
from python_tools.modules.fileio import (
    # 核心管理器
    FileManager,
    DirectoryManager,
    
    # 基础文件处理器
    TextFileHandler,
    BinaryFileHandler,
    CSVFileHandler,
    JSONFileHandler,
    YAMLFileHandler,
    XMLFileHandler,
    ExcelFileHandler,
    
    # 多媒体文件处理器
    ImageFileHandler,
    AudioFileHandler,
    VideoFileHandler,
    PDFFileHandler,
    
    # 特殊文件处理器
    ArchiveHandler,
    HTMLHandler,
    ConfigHandler,
    
    # 工具函数
    get_file_info,
    get_file_type,
    get_file_size,
    get_file_hash,
    is_file_exists,
    is_dir_exists,
    copy_file,
    move_file,
    delete_file,
    create_temp_file,
    create_temp_dir
)


def text_file_example():
    """文本文件操作示例"""
    print("\n=== 文本文件操作示例 ===")
    
    # 创建临时目录
    temp_dir = tempfile.mkdtemp()
    file_path = os.path.join(temp_dir, "example.txt")
    
    # 创建文本文件处理器
    text_handler = TextFileHandler()
    
    # 写入文本文件
    content = "Hello, World!\nThis is a text file example."
    text_handler.write(file_path, content)
    print(f"已写入文本文件: {file_path}")
    
    # 读取文本文件
    read_content = text_handler.read(file_path)
    print(f"读取文件内容:\n{read_content}")
    
    # 追加内容
    text_handler.append(file_path, "\nThis is an appended line.")
    print("已追加内容")
    
    # 再次读取
    read_content = text_handler.read(file_path)
    print(f"追加后的内容:\n{read_content}")
    
    # 获取文件信息
    info = get_file_info(file_path)
    print(f"文件信息: {info}")
    
    # 计算文件哈希值
    hash_value = get_file_hash(file_path, algorithm="md5")
    print(f"文件MD5哈希值: {hash_value}")
    
    # 清理
    delete_file(file_path)
    os.rmdir(temp_dir)
    print(f"已删除临时文件和目录")


def json_file_example():
    """JSON文件操作示例"""
    print("\n=== JSON文件操作示例 ===")
    
    # 创建临时目录
    temp_dir = tempfile.mkdtemp()
    file_path = os.path.join(temp_dir, "example.json")
    
    # 创建JSON文件处理器
    json_handler = JSONFileHandler()
    
    # 写入JSON文件
    data = {
        "name": "John",
        "age": 30,
        "city": "New York",
        "skills": ["Python", "JavaScript", "SQL"],
        "contact": {
            "email": "john@example.com",
            "phone": "123-456-7890"
        }
    }
    json_handler.write(file_path, data)
    print(f"已写入JSON文件: {file_path}")
    
    # 读取JSON文件
    loaded_data = json_handler.read(file_path)
    print(f"读取的JSON数据: {loaded_data}")
    
    # 更新JSON数据
    loaded_data["age"] = 31
    loaded_data["skills"].append("Java")
    json_handler.write(file_path, loaded_data)
    print("已更新JSON数据")
    
    # 再次读取
    updated_data = json_handler.read(file_path)
    print(f"更新后的JSON数据: {updated_data}")
    
    # 清理
    delete_file(file_path)
    os.rmdir(temp_dir)
    print(f"已删除临时文件和目录")


def xml_file_example():
    """XML文件操作示例"""
    print("\n=== XML文件操作示例 ===")
    
    # 创建临时目录
    temp_dir = tempfile.mkdtemp()
    file_path = os.path.join(temp_dir, "example.xml")
    
    # 创建XML文件处理器
    xml_handler = XMLFileHandler()
    
    # 创建XML元素
    import xml.etree.ElementTree as ET
    root = ET.Element("root")
    
    # 添加子元素
    person = ET.SubElement(root, "person", {"id": "1"})
    name = ET.SubElement(person, "name")
    name.text = "John"
    age = ET.SubElement(person, "age")
    age.text = "30"
    
    # 写入XML文件
    xml_handler.write(file_path, root)
    print(f"已写入XML文件: {file_path}")
    
    # 读取XML文件
    loaded_root = xml_handler.read(file_path)
    
    # 查找元素
    person_element = xml_handler.find_element(loaded_root, "./person")
    name_element = xml_handler.find_element(person_element, "./name")
    print(f"找到的名字: {name_element.text}")
    
    # 修改元素
    age_element = xml_handler.find_element(person_element, "./age")
    age_element.text = "31"
    
    # 添加新元素
    city = ET.SubElement(person_element, "city")
    city.text = "New York"
    
    # 保存修改后的XML
    xml_handler.write(file_path, loaded_root)
    print("已更新XML文件")
    
    # 再次读取
    updated_root = xml_handler.read(file_path)
    updated_person = xml_handler.find_element(updated_root, "./person")
    city_element = xml_handler.find_element(updated_person, "./city")
    print(f"添加的城市: {city_element.text}")
    
    # 清理
    delete_file(file_path)
    os.rmdir(temp_dir)
    print(f"已删除临时文件和目录")


def config_file_example():
    """配置文件操作示例"""
    print("\n=== 配置文件操作示例 ===")
    
    # 创建临时目录
    temp_dir = tempfile.mkdtemp()
    
    # 创建配置文件处理器
    config_handler = ConfigHandler()
    
    # 准备配置数据
    config_data = {
        "app": {
            "name": "MyApp",
            "version": "1.0.0",
            "debug": True
        },
        "database": {
            "host": "localhost",
            "port": 5432,
            "username": "user",
            "password": "password"
        },
        "logging": {
            "level": "INFO",
            "file": "app.log"
        }
    }
    
    # 写入不同格式的配置文件
    json_path = os.path.join(temp_dir, "config.json")
    yaml_path = os.path.join(temp_dir, "config.yaml")
    toml_path = os.path.join(temp_dir, "config.toml")
    
    # 写入JSON格式
    config_handler.write(json_path, config_data)
    print(f"已写入JSON配置文件: {json_path}")
    
    # 写入YAML格式
    config_handler.write(yaml_path, config_data)
    print(f"已写入YAML配置文件: {yaml_path}")
    
    # 写入TOML格式
    config_handler.write(toml_path, config_data)
    print(f"已写入TOML配置文件: {toml_path}")
    
    # 读取配置
    json_config = config_handler.read(json_path)
    yaml_config = config_handler.read(yaml_path)
    toml_config = config_handler.read(toml_path)
    
    # 验证配置一致性
    print(f"JSON配置中的应用名称: {json_config['app']['name']}")
    print(f"YAML配置中的应用名称: {yaml_config['app']['name']}")
    print(f"TOML配置中的应用名称: {toml_config['app']['name']}")
    
    # 更新配置
    config_handler.set_value(json_path, "app.version", "1.1.0")
    print("已更新JSON配置文件中的版本号")
    
    # 读取更新后的配置
    updated_json_config = config_handler.read(json_path)
    print(f"更新后的版本号: {updated_json_config['app']['version']}")
    
    # 清理
    delete_file(json_path)
    delete_file(yaml_path)
    delete_file(toml_path)
    os.rmdir(temp_dir)
    print(f"已删除临时文件和目录")


def archive_example():
    """压缩文件操作示例"""
    print("\n=== 压缩文件操作示例 ===")
    
    # 创建临时目录
    temp_dir = tempfile.mkdtemp()
    source_dir = os.path.join(temp_dir, "source")
    os.mkdir(source_dir)
    
    # 创建一些测试文件
    text_handler = TextFileHandler()
    text_handler.write(os.path.join(source_dir, "file1.txt"), "This is file 1")
    text_handler.write(os.path.join(source_dir, "file2.txt"), "This is file 2")
    
    # 创建子目录和文件
    sub_dir = os.path.join(source_dir, "subdir")
    os.mkdir(sub_dir)
    text_handler.write(os.path.join(sub_dir, "file3.txt"), "This is file 3")
    
    # 创建压缩文件处理器
    archive_handler = ArchiveHandler()
    
    # 创建ZIP文件
    zip_path = os.path.join(temp_dir, "archive.zip")
    archive_handler.create_zip(zip_path, source_dir)
    print(f"已创建ZIP文件: {zip_path}")
    
    # 列出ZIP文件内容
    file_list = archive_handler.list_zip_contents(zip_path)
    print("ZIP文件内容:")
    for file in file_list:
        print(f"  {file}")
    
    # 解压ZIP文件
    extract_dir = os.path.join(temp_dir, "extracted")
    archive_handler.extract_zip(zip_path, extract_dir)
    print(f"已解压ZIP文件到: {extract_dir}")
    
    # 验证解压结果
    extracted_file = os.path.join(extract_dir, "file1.txt")
    if is_file_exists(extracted_file):
        content = text_handler.read(extracted_file)
        print(f"解压后的文件内容: {content}")
    
    # 清理
    import shutil
    shutil.rmtree(temp_dir)
    print(f"已删除临时目录")


def file_utils_example():
    """文件工具函数示例"""
    print("\n=== 文件工具函数示例 ===")
    
    # 创建临时文件
    temp_file = create_temp_file(suffix=".txt")
    print(f"创建的临时文件: {temp_file}")
    
    # 写入内容
    with open(temp_file, "w") as f:
        f.write("This is a temporary file.")
    
    # 获取文件信息
    info = get_file_info(temp_file)
    print(f"文件信息: {info}")
    
    # 获取文件类型
    file_type = get_file_type(temp_file)
    print(f"文件类型: {file_type}")
    
    # 获取文件大小
    size = get_file_size(temp_file)
    print(f"文件大小: {size} 字节")
    
    # 复制文件
    temp_dir = create_temp_dir()
    copy_path = os.path.join(temp_dir, "copied.txt")
    copy_file(temp_file, copy_path)
    print(f"已复制文件到: {copy_path}")
    
    # 移动文件
    move_path = os.path.join(temp_dir, "moved.txt")
    move_file(copy_path, move_path)
    print(f"已移动文件到: {move_path}")
    
    # 检查文件是否存在
    if is_file_exists(move_path):
        print(f"文件存在: {move_path}")
    
    # 删除文件
    delete_file(temp_file)
    delete_file(move_path)
    print("已删除临时文件")
    
    # 删除临时目录
    os.rmdir(temp_dir)
    print("已删除临时目录")


def main():
    """主函数"""
    print("文件操作模块使用示例")
    
    # 运行示例
    text_file_example()
    json_file_example()
    xml_file_example()
    config_file_example()
    archive_example()
    file_utils_example()
    
    print("\n所有示例已完成")


if __name__ == "__main__":
    main()